#导入时间包
from datetime import datetime
#导入显示等待包
from selenium.webdriver.support.ui import WebDriverWait
#导入下拉框包
from selenium.webdriver.support.select import Select

#导入键盘包
from selenium.webdriver.common.keys import Keys
#导入鼠标包
from selenium.webdriver.common.action_chains import ActionChains

#导入显示等待判断包
from selenium.webdriver.support import expected_conditions as e

#导入强制等待时间包
import time

#定义一个类
class Base():
    #定义一个方法
    def __init__(self, driver):
        #封装浏览器驱动
        self.driver = driver

    #封装打开酒仙首页方法
    def ope_url(self, url):
        self.driver.get(url)

    #封装页面定位元素
    def find_element(self, loc):
        #异常处理
        try:
            #显示等待
            WebDriverWait(self.driver, 20, 0.5).until(lambda driver: driver.find_element(*loc).is_displayed())

            return self.driver.find_element(*loc)

        except Exception as e:
            #获取时间戳
            datatime = datetime.now().strftime('%Y%m%d_%H%M%S')
            #异常截图
            self.driver.save_screenshot(f'error_{datatime}.png')
            print('页面元素未定位到', e)

    #封装点击方法
    def click(self, loc):
        self.find_element(loc).click()

    #封装输入方法
    def send_keys(self, loc, info):
        self.find_element(loc).send_keys(info)

    #封装滚动条
    def execute_script(self, x):
        self.driver.execute_script(f'window.scrollTo(0,{x})')

    #封装弹框处理确认方法
    def alert(self):
        alert1 = self.driver.switch_to.alert
        #确认
        alert1.accept()

    # 封装弹框处理取消方法
    def alert2(self):
        alert1 = self.driver.switch_to.alert
        #取消
        alert1.dismiss()

    #封装iframe
    def iframe(self, loc):
        self.driver.switch_to.frame(self.find_element(loc))

    #封装切换页面
    def window(self):
        self.driver.switch_to.window(self.driver.window_handles[-1])

    #封装下拉框选择value方法
    def select(self, loc, x):
        select = Select(self.find_element(loc))
        select.select_by_value(x)

    #下标方法
    def select1(self, loc, x):
        select = Select(self.find_element(loc))
        select.select_by_index(x)

    #文本方法
    def select2(self, loc, x):
        select = Select(self.find_element(loc))
        select.select_by_visible_text(x)

    #封装鼠标事件点击
    def ActionChains(self, loc):
        ActionChains(self.driver).click(self.find_element(loc)).perform()

    # 封装鼠标事件
    def ActionChains1(self, loc):
        ActionChains(self.driver).double_click(self.find_element(loc)).perform()

    # 封装鼠标事件悬停
    def ActionChains2(self, loc):
        ActionChains(self.driver).move_to_element(self.find_element(loc)).perform()

    #封装键盘事件
    def key(self, loc):
        self.find_element(loc).send_keys(Keys.ENTER)

    #封装浏览器事件刷新
    def refresh(self):
        self.driver.refresh()

    #封装浏览器事件后退
    def back(self):
        self.driver.back()

    #封装浏览器前进方法
    def forward(self):
        self.driver.forward()

    #封装隐式等待方法
    def implicitly_wait(self,x):
        self.driver.implicitly_wait(x)

    #封装强制等待时间方式
    def sleep(self,x):
        time.sleep(x)

    #封装显示等待方法
    def WebDriverWait(self,loc):
        WebDriverWait(self.driver,20,0.5).until(e.presence_of_element_located(loc))

    #封装清空数据方法
    def clear(self,x):
        self.driver.clear(x)
